﻿using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace consumer.Consumers
{
    internal class HelloWorld
    {
        public static void Get()
        {
            try
            {
                string name = "hello";

                var factory = new ConnectionFactory();
                factory.HostName = "127.0.0.1";
                factory.Port = 5672;
                factory.UserName = "aggie";
                factory.Password = "123456";
                factory.VirtualHost = "/myTest";

                // 获取TCP 长连接
                using (var conntection = factory.CreateConnection())
                {
                    // 创建通信"通道",相当与TCP中的虚拟链接
                    using (var channel = conntection.CreateModel())
                    {
                        /*
                        * 创建队列，声明并创建一个队列，如果队列已存在，则使用这个队列
                        * 第一个参数：队列名称ID
                        * 第二个参数：是否持久化，false对应不持久数据，MQ停掉数据就会丢失
                        * 第三个参数：是否队列私有化，false代表所有消费者可以访问，true代表只有第一次拥有它的消费者才能一直使用
                        * 第四个参数：是否自动删除，false代表连接停掉后不自动删除这个队列
                        * 其他参数为Null
                        */
                        channel.QueueDeclare(name, true, false, false, null);

                        // 申明的事件
                        EventingBasicConsumer consumers = new EventingBasicConsumer(channel);
                        //触发事件
                        consumers.Received += (model, ea) =>
                        {
                            var body = ea.Body.ToArray();
                            var msg = Encoding.UTF8.GetString(body);
                            channel.BasicAck(ea.DeliveryTag, false);
                            Console.WriteLine($"HelloWorld模式下接受消息：{msg}");

                        };
                        /*
                         * 从MQ服务器中获取数据
                         * 创建一个消息消费者
                         * 第一个参数：队列名
                         * 第二个参数：是否自动接受消息，false代表手动确定消息，这是MQ推荐的做法
                         * 第三个参数：要传入的IBasicConsumer接口
                         */
                        channel.BasicConsume(name, false, consumers);
                        Console.WriteLine("Press [Enter] to exit");
                        Console.Read();

                    }
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
                Console.Read();
            }
        }
    }
}
